"""
@Project: pythonPro1
@Name: p16输入和输出.py
@Author: linxin_liu
@Date: 2022/9/18 9:22
一、输出方式
1. 输出表达式
2. print()函数输出
3. 文件对象的write()输出，标准输出文件可以使用sys.stdout引用
4. 为了输出的格式更加多样，可以使用str.format()函数
5. 如果你希望将输出的值转成字符串，可以使用 repr() 或 str() 函数来实现。
       str()： 函数返回一个用户易读的表达形式。
       repr()： 产生一个解释器易读的表达形式。
"""
import math
import pprint, pickle

str1 = '世界'
print('用户易读：', str(str1))
print('解释器易读：', repr(str1))
print('字符串：', repr(1/7))
print('转义字符串中的特殊字符：', repr('good\n'))
print('参数可以是任意对象：', {'one': ('a', 'b'), 'two': [1, 2]})
# repr(str1).rjust()这个例子展示了字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格。
for i in range(1, 5):
    print('{0:2d} {1:3d} {my_end:4d}'.format(i, i*i, my_end=i*i*i))
print('pi的近似值：{0:.4f}'.format(math.pi))

# 输入
# str2 = input('请输入内容：')
# print('你输入的是:', str2)

# 读和写文件
file1 = open('F:\\python_data\\data1.txt', 'r', encoding='utf-8')
print('读取文件：', file1.read())
file1.close()
print('关闭文件')

"""
6. 
file1.readline() 会从文件中读取单独的一行。换行符为 '\n'。
file1.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。

file1.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。

file1.write(string) 将 string 写入到文件中, 然后返回写入的字符数。 
"""
print('====打开文件====')
file2 = open('F:\\python_data\\data.txt', 'a+', encoding='utf-8')  # 读写模式
print('追加文件的字符数：', file2.write('\n来自银河系.\n来自地球'))
# 如果要写入一些不是字符串的东西, 那么将需要先进行转换
print('追加文件的字符数：', file2.write(str(('key1', 'value1'))))
file2.close()
print('关闭文件')
print('打开文件')
file2 = open('F:\\python_data\\data.txt', 'rb+')
print(file2.read())
print('返回文件对象当前所处的位置:', file2.tell())  # f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数
file2.seek(18, 1)  # 从当前位置向前移动18个字符
print('移动指针后追加文件的字符数：', file2.write(b'012'))
file2.close()
print('关闭文件')

"""
7. 
在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
当处理一个文件对象时, 使用 with 关键字是非常好的方式。
在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
with open('/tmp/foo.txt', 'r') as f:
     read_data = f.read()
f.closed
"""
print('====另一种打开方式====')
with open('F:\\python_data\\data.txt', 'r', encoding='utf-8') as file2:
    print(file2.read())
print('是否关闭文件：', file2.closed)
print('关闭文件')

"""
8. pickle模块-实现了基本的数据序列和反序列化。
"""
# 自定义一份数据
data1 = {
    'a': [1, 2, 3],
    'b': ('one', 'two', 'three'),
    'c': {'tom', 'jack'}
}
# 指定一个文件testPkl
output = open('F:\\python_data\\testPkl.pkl', 'wb')
pickle.dump(data1, output)  # 将数据序列化后存入文件
output.close()

# 使用pickle模块从文件中重构python对象
pkl_file = open('F:\\python_data\\testPkl.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

pkl_file.close()

